Optimize with LetTrade Grid Search¶
Grid Search¶
Sample Strategy¶
InĀ [1]:
Copied!
# import talib.abstract as ta
from lettrade import DataFeed, Strategy, indicator as i
from lettrade.exchange.backtest import ForexBackTestAccount, let_backtest
from lettrade.indicator.vendor.qtpylib import inject_indicators
inject_indicators()
class SmaCross(Strategy):
ema1_period = 9
ema2_period = 21
def indicators(self, df: DataFeed):
# df["ema1"] = ta.EMA(df, timeperiod=self.ema1_period)
# df["ema2"] = ta.EMA(df, timeperiod=self.ema2_period)
df["ema1"] = df.close.ema(window=self.ema1_period)
df["ema2"] = df.close.ema(window=self.ema2_period)
df["signal_ema_crossover"] = i.crossover(df.ema1, df.ema2)
df["signal_ema_crossunder"] = i.crossunder(df.ema1, df.ema2)
def next(self, df: DataFeed):
if len(self.orders) > 0 or len(self.positions) > 0:
return
if df.l.signal_ema_crossover[-1]:
price = df.l.close[-1]
self.buy(size=0.1, sl=price - 0.001, tp=price + 0.001)
elif df.l.signal_ema_crossunder[-1]:
price = df.l.close[-1]
self.sell(size=0.1, sl=price + 0.001, tp=price - 0.001)
lt = let_backtest(
strategy=SmaCross,
datas="example/data/data/EURUSD_5m_0_10000.csv",
account=ForexBackTestAccount,
# plotter=None,
)
# import talib.abstract as ta
from lettrade import DataFeed, Strategy, indicator as i
from lettrade.exchange.backtest import ForexBackTestAccount, let_backtest
from lettrade.indicator.vendor.qtpylib import inject_indicators
inject_indicators()
class SmaCross(Strategy):
ema1_period = 9
ema2_period = 21
def indicators(self, df: DataFeed):
# df["ema1"] = ta.EMA(df, timeperiod=self.ema1_period)
# df["ema2"] = ta.EMA(df, timeperiod=self.ema2_period)
df["ema1"] = df.close.ema(window=self.ema1_period)
df["ema2"] = df.close.ema(window=self.ema2_period)
df["signal_ema_crossover"] = i.crossover(df.ema1, df.ema2)
df["signal_ema_crossunder"] = i.crossunder(df.ema1, df.ema2)
def next(self, df: DataFeed):
if len(self.orders) > 0 or len(self.positions) > 0:
return
if df.l.signal_ema_crossover[-1]:
price = df.l.close[-1]
self.buy(size=0.1, sl=price - 0.001, tp=price + 0.001)
elif df.l.signal_ema_crossunder[-1]:
price = df.l.close[-1]
self.sell(size=0.1, sl=price + 0.001, tp=price - 0.001)
lt = let_backtest(
strategy=SmaCross,
datas="example/data/data/EURUSD_5m_0_10000.csv",
account=ForexBackTestAccount,
# plotter=None,
)
Optimize¶
LetTrade will auto cache optimize result
InĀ [2]:
Copied!
lt.optimize(ema1_period=[5, 6, 7, 8, 9, 10], ema2_period=range(10, 50, 1))
lt.optimize(ema1_period=[5, 6, 7, 8, 9, 10], ema2_period=range(10, 50, 1))
49%|āāāāā | 117/240 [00:00<00:00, 476.26it/s]
100%|āāāāāāāāāā| 240/240 [00:00<00:00, 707.73it/s]
Rerun Optimize will reuse optimize result cached
InĀ [3]:
Copied!
lt.optimize(ema1_period=range(5, 25), ema2_period=range(10, 50, 1))
lt.optimize(ema1_period=range(5, 25), ema2_period=range(10, 50, 1))
6%|ā | 51/800 [00:00<00:05, 140.44it/s]
100%|āāāāāāāāāā| 800/800 [00:00<00:00, 1405.26it/s]
Plot¶
InĀ [4]:
Copied!
lt.plotter.heatmap(x="ema1_period", y="ema2_period", z="equity")
lt.plotter.heatmap(x="ema1_period", y="ema2_period", z="equity")
InĀ [5]:
Copied!
lt.plotter.contour(x="ema1_period", y="ema2_period", z="equity")
lt.plotter.contour(x="ema1_period", y="ema2_period", z="equity")
Optimize from cache¶
Load optimize result from cache
InĀ [6]:
Copied!
lt.optimize_cache()
lt.optimize_cache()
Load caches from: data/optimize Loaded 943 caches
Plot¶
InĀ [7]:
Copied!
lt.plotter.heatmap()
lt.plotter.heatmap()
InĀ [8]:
Copied!
lt.plotter.contour()
lt.plotter.contour()